package com.lmm.rpc.core.transport;

import com.lmm.rpc.core.client.NettyClientFactory;
import com.lmm.rpc.core.client.protocol.MessageProtocol;
import com.lmm.rpc.core.common.reponse.DefaultRepose;

import java.util.Map;
import java.util.Objects;
import java.util.Timer;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 临时缓存：请求和响应映射对象
 *
 * @Author: changjiu.wang
 * @Date: 2021/7/25 15:17
 * 把服务器提供者的端口和ip解析后存在本地，这样不用每次都去zookeeper注册中心找到服务提供者的信息
 */
public class LocalRpcResponseCache {

//    初始化了一个ConcurrentHashMap来做本地缓存，缓存服务提供者的信息
    private static final Map<String, RpcFuture<MessageProtocol<DefaultRepose>>> requestResponseCache = new ConcurrentHashMap<>(256);

    /**
     *  添加请求和响应的映射关系
     * @param reqId
     * @param future
     */
    public static void add(String reqId, RpcFuture<MessageProtocol<DefaultRepose>> future){
        requestResponseCache.put(reqId, future);
    }

    /**
     *  设置响应数据
     * @param reqId
     * @param messageProtocol
     */
    public static void fillResponse(String reqId, MessageProtocol<DefaultRepose> messageProtocol){
        // 获取缓存中的 future
        RpcFuture<MessageProtocol<DefaultRepose>> future = requestResponseCache.get(reqId);
        if (Objects.nonNull(future)){
            // 设置数据
            future.setResponse(messageProtocol);
            // 获取到消息后，就可以清空临时缓存了，因为本次数据传输只会用一次
            requestResponseCache.remove(reqId);
            if (Objects.nonNull(future.getRpcCallback())){
                NettyClientFactory.getInstance().executeInvokeCallback(future,null);
            }
        }

    }


    public static Map<String, RpcFuture<MessageProtocol<DefaultRepose>>> getRequestResponseCache() {
        return requestResponseCache;
    }
}
